package gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.io.File;

import javax.swing.JLabel;
import javax.swing.border.LineBorder;
import logic.Constantes;

import java.util.ArrayList;

public class Block extends JLabel{

	ArrayList<Image>   	_Images;
	ArrayList<Double>  	_ImagesDegrees;
	private int[] 		_Adyacencia;
	private int			_Type;
	private int			_Id;
	private int			_Row;
	private int 		_Col;
	private ArrayList<Block> _Hijos;

	private boolean		_restaurable = false;
	
	
	public final static int 	VAR = 0;
	public final static int		TOK = 1;
	public final static int		ADD = 0;
	/*  
	 * 	CLASS
	 *  0 = bloques de relleno
	 *  1 = comandos
	 *  2 = variables
	 * 
	 * 	ID: bloques de relleno
	 *  0  = bloque de relleno  | hacia arriba
	 * 	1  = bloque de relleno ┐  hacia derecha
	 * 	2  = bloque de relleno └  hacia izquierda
	 *  3  = bloque de relleno ┌  hacia derecha
	 * 	4  = bloque de relleno ┘  hacia izquierda
	 * 	5  = bloque de relleno -  hacia derecha
	 *  6  = bloque de relleno  | hacia abajo
	 * 	7  = bloque de relleno ┐  hacia abajo
	 * 	8  = bloque de relleno └  hacia arriba
	 *  9  = bloque de relleno ┌  hacia abajo
	 * 	10 = bloque de relleno ┘  hacia arriba
	 * 	11 = bloque de relleno -  hacia izquierda
	 * 	
	 * ID: comandos 
	 *  0 = inicio
	 * 	1 = if
	 *  2 = end if
	 *  3 = llamar otra fuction
	 *  
	 *  ID: variables
	 *  un numero unico para
	 *  cada variable
	 *  
	 */
	
	
	
	public int getType() {
		return _Type;
	}

	public boolean is_restaurable() {
		return _restaurable;
	}

	public void set_restaurable(boolean _restaurable) {
		this._restaurable = _restaurable;
	}

	public int getId() {
		return _Id;
	}

	public void setType(int pType) {
		this._Type = pType;
	}

	public void setId(int pId) {
		this._Id = pId;
	}

	
	public ArrayList<Block> getHijos() {
		return _Hijos;
	}

	public void addHijo( Block pHijo) {
		_Hijos.add(pHijo);
	}
	
	public Block(){
		setBackground(Color.white);
		setOpaque(true);
		setBorder(new LineBorder(new Color(171, 173, 179), 2));
		_Images         = new ArrayList<Image>();
		_ImagesDegrees  = new ArrayList<Double>();
	}
	
	// Getts
	public ArrayList<Image> getImages() {
		return _Images;
	}
	public ArrayList<Double> getImagesDegrees() {
		return _ImagesDegrees;
	}
	public int[] getAdyacencia() {
		return Constantes.ADY_OPTION[_Type][_Id];
	}

	public String getImage(boolean pStatic) {
		String sFichero;
		if(pStatic){
			sFichero = Constantes.IMAGE_FOLDER+_Type+_Id+Constantes.IMAGE_STATIC+Constantes.IMAGE_FORMAT;
		}else{
			sFichero = Constantes.IMAGE_FOLDER+_Type+_Id+Constantes.IMAGE_ANIM+Constantes.IMAGE_FORMAT;
		}
		File fichero = new File(sFichero);
		if (fichero.exists()){
			return sFichero;
		}
		return Constantes.IMAGE_FOLDER+Constantes.IMAGE_ERROR+Constantes.IMAGE_FORMAT;
	}
	
	// Setts
	public void setImagesDegrees(ArrayList<Double> pImagesDegrees) {
		_ImagesDegrees = pImagesDegrees;
	}
	public void setImages(ArrayList<Image> pImages) {
		_Images = pImages;
	}

	public void addImage( Image image , double degree ){
		_Images.add(image);
		_ImagesDegrees.add(degree);
	}
	
	public void paint( Graphics g ){
		super.paint(g);
		for ( int img = 0 ; img < _Images.size() ; img++ ){
			AffineTransform transform = new AffineTransform();
			transform.rotate(Math.toRadians(_ImagesDegrees.get(img)), getWidth()/2 , getHeight()/2 );
			((Graphics2D)g).transform(transform);
			g.drawImage( _Images.get(img) , 0 , 0 , getWidth() , getHeight() , null);
			transform.rotate(-Math.toRadians(_ImagesDegrees.get(img)), getWidth()/2 , getHeight()/2 );
		}
	}
	
	public int getRow() {
		return _Row;
	}

	public void setRow(int _Row) {
		this._Row = _Row;
	}

	public int getCol() {
		return _Col;
	}

	public void setCol(int _Col) {
		this._Col = _Col;
	}
	
	
}
